package com.itzhoun;

import com.itzhoun.calu.AddStrategy;
import com.itzhoun.calu.Strategy;
import com.itzhoun.calu.SubStrategy;

/**
 * @author 周楠
 * @Date 2023/01/28/上午 11:38
 */
public class Environment {

    /**
     * 环境类
     */

    private Strategy strategy;

    public Environment(Strategy strategy) {
        this.strategy = strategy;
    }

    public int calc(int num1, int num2){
        return strategy.calc(num1, num2);
    }

    /**
     * 定义： 策略模式定义了一系列算法，并将每个算法封装起来，使他们可以相互替换，且算法的变化不会影响到使用算法的客户。
     * 优点： 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
     *
     * 缺点： 1、策略类会增多。 2、所有策略类都需要对外暴露。
     *
     * 该模式三个角色：
     * 抽象策略角色: 这个是一个抽象的角色，通常情况下使用接口或者抽象类去实现。对比来说，就是我们的Comparator接口。
     * 具体策略角色: 包装了具体的算法和行为。对比来说，就是实现了Comparator接口的实现一组实现类。
     * 环境角色: 内部会持有一个抽象角色的引用，给客户端调用。
     */

    public static void main(String[] args) {

        Environment environment = new Environment(new AddStrategy());
        int calc = environment.calc(1, 2);

        System.out.println("加法：" + calc);

        Environment environment1 = new Environment(new SubStrategy());
        int calc1 = environment1.calc(3, 1);

        System.out.println("减法：" + calc1);

    }
}
